/* eslint-disable no-console */
// ============================== 导入依赖 ============================== //

import COMMON from './common'
import DAY from './day'
import IS from './is'

// ============================== 导出日志工具 ============================== //

export default {
  /**
   * 正常日志
   *
   * @param {String} TIP    提示
   * @param {Object} params 参数
   * @param {Object} result 结果
   * @param {Number} times  耗时
   */
  logInfo(TIP, params, result, times = 0) {
    if (!checkDebug(this)) return
    console.info(...getFormatList(TIP, times, INFO), toObj(params), toObj(result))
  },

  /**
   * 警告日志
   *
   * @param {String} TIP    提示
   * @param {Object} params 参数
   * @param {Object} result 结果
   * @param {Number} times  耗时
   */
  logWarn(TIP, params, result, times = 0) {
    if (!checkDebug(this)) return
    console.warn(...getFormatList(TIP, times, WARN), toObj(params), toObj(result))
  },

  /**
   * 错误日志
   *
   * @param {String} TIP    提示
   * @param {Object} params 参数
   * @param {Object} error  异常
   * @param {Number} times  耗时
   */
  logError(TIP, params, error, times = 0) {
    if (!checkDebug(this)) return
    console.error(...getFormatList(TIP, times, ERROR), toObj(params), error)
  },
}

// ============================== 内部常量 ============================== //

const isIE = !!window.ActiveXObject || 'ActiveXObject' in window

const LINE = '='.repeat(30)
const INFO = 'font-size:16px;color:#080;background:#dfd;'
const WARN = 'font-size:16px;color:#f80;background:#ff0;'
const ERROR = 'font-size:16px;color:#fff;background:#f44;'
const BOLD = 'font-size:14px;font-weight:bold;'

// ============================== 内部方法 ============================== //

/**
 * 检查能否调试
 */
export const checkDebug = (CORE) => {
  if (process.env.VUE_APP_DEBUG_PORT) return true // 调试环境
  if (sessionStorage.debug || localStorage.debug) return true // 缓存配置
  return !CORE.isProd() // 非生产环境
}

/**
 * 获取格式列表
 *
 * @param {String} TIP 操作
 * @param {Number} times   耗时
 * @param {String} style   样式
 *
 * @returns {Array} 格式列表
 */
const getFormatList = (TIP, times, style) => {
  const millisecond = `    [ ${times} ms ]`
  const second = `    【%c ${times / 1000} 秒 %c】`
  const timesStr = times ? (times < 1000 ? millisecond : second) : ''

  const format = `%c${LINE} ${TIP} ${LINE}%c   ${DAY.now()}${timesStr}\n参数 %o\n结果 %o\n`

  if (isIE) return [format.replace(/%c/g, '')]
  return times < 1000 ? [format, style, ''] : [format, style, '', BOLD, '']
}

/**
 * 转换对象
 *
 * @param {Object} data 数据
 *
 * @returns {Object} 对象
 */
const toObj = (data) => {
  let obj = {}
  if (IS.isFormData(data)) data.forEach((value, key) => (obj[key] = value))
  else obj = COMMON.clone(data)
  return obj
}
